home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / su.c < prev    next >
C/C++ Source or Header  |  1990-07-23  |  1KB  |  55 lines

  1. /* su - become super-user        Author: Patrick van Kleef */
  2.  
  3. #include <sys/types.h>
  4. #include <sgtty.h>
  5. #include <pwd.h>
  6.  
  7. main(argc, argv)
  8. int argc;
  9. char *argv[];
  10. {
  11.   register char *name;
  12.   char *crypt();
  13.   char *shell = "/bin/sh";
  14.   char *shell2 = "/usr/bin/sh";
  15.   int nr;
  16.   char password[14];
  17.   struct sgttyb args;
  18.   register struct passwd *pwd;
  19.   struct passwd *getpwnam();
  20.  
  21.   if (argc > 1)
  22.     name = argv[1];
  23.   else
  24.     name = "root";
  25.  
  26.   if ((pwd = getpwnam(name)) == 0) {
  27.     std_err("Unknown id: ");
  28.     std_err(name);
  29.     std_err("\n");
  30.     exit(1);
  31.   }
  32.   if (pwd->pw_passwd[0] != '\0' && getuid() != 0) {
  33.     std_err("Password: ");
  34.     ioctl(0, TIOCGETP, &args);    /* get parameters */
  35.     args.sg_flags = args.sg_flags & (~ECHO);
  36.     ioctl(0, TIOCSETP, &args);
  37.     nr = read(0, password, 14);
  38.     password[nr - 1] = 0;
  39.     std_err("\n");
  40.     args.sg_flags = args.sg_flags | ECHO;
  41.     ioctl(0, TIOCSETP, &args);
  42.     if (strcmp(pwd->pw_passwd, crypt(password, pwd->pw_passwd))) {
  43.         std_err("Sorry\n");
  44.         exit(2);
  45.     }
  46.   }
  47.   setgid(pwd->pw_gid);
  48.   setuid(pwd->pw_uid);
  49.   if (pwd->pw_shell[0]) shell = pwd->pw_shell;
  50.   execl(shell, shell, "-i", (char *) 0);
  51.   execl(shell2, shell2, "-i", (char *) 0);
  52.   std_err("No shell\n");
  53.   exit(3);
  54. }
  55.